#include "commonform.h"
#include "ui_commonform.h"
#include "listitem.h"
#include "musiclist.h"
#include <QDebug>

CommonForm::CommonForm(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::CommonForm)
{
    ui->setupUi(this);
    // 设置水平滚动条永远关闭
    ui->musicInfo->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    // 关联双击后播放音乐的槽函数
    connect(ui->musicInfo, &QAbstractItemView::doubleClicked, this, [=](const QModelIndex &index){
        emit playByDoubleClicked(type, index.row());
    });
}

CommonForm::~CommonForm()
{
    delete ui;
}

void CommonForm::setCommonPageTextAndCover(const QString &text, const QString &image)
{
    ui->musicCover->setPixmap(QPixmap(image));
    ui->pageTitle->setText(text);
}

void CommonForm::setPageType(PageType type)
{
    this->type = type;
}

void CommonForm::addMusicToMusicPage(MusicList &musicList)
{
    // 清除之前的歌曲的内容:注意这里的清除与页面无关
    musicOfPage.clear();

    for(auto e : musicList)
    {
        switch(type)
        {
            case LIKE:
                // 点击了收藏喜欢才放入
                if(e.getIsLike())
                    musicOfPage.push_back(e.getMusicId());
                break;
            case LOCAL:
                // 本地音乐都要放入
                musicOfPage.push_back(e.getMusicId());
                break;
            case RECENT:
                // 播放了历史音乐才放入
                if(e.getIsHistory())
                    musicOfPage.push_back(e.getMusicId());
                break;
            default:
                qDebug() << "暂未支持";
        }
    }
}

void CommonForm::reFresh(MusicList &musicList)
{
    // 页面的清除：将原来的 musicList 进行清空，这里的清空方法会将内存的都清理掉，永久删除
    ui->musicInfo->clear();

    // 添加新的歌曲
    addMusicToMusicPage(musicList);

    // 遍历这个界面所有的歌曲
    for(auto musicId : musicOfPage)
    {
        auto it = musicList.findMusicByMusicId(musicId);
        // 如果没有找到，说明歌曲不存在，继续查找下一个歌曲
        if(it == musicList.end()) continue;
        // 将 music 的歌曲名称、歌手、专辑名称等更新到界面上
        // 测试自定义 ListWidgetItem
        ListItem* listItem = new ListItem(this);
        // 设置 music 的歌曲名称、歌手、专辑名称
        listItem->setMusicName(it->getMusicName());
        listItem->setMusicSinger(it->getMusicSinger());
        listItem->setMusicAlbum(it->getMusicAlbum());
        listItem->setIsLikeAndIcon(it->getIsLike());  // 初始化黑心心
        // 设置自定义表项
        QListWidgetItem* item = new QListWidgetItem(ui->musicInfo);
        item->setSizeHint(QSize(listItem->width(), listItem->height()));
        ui->musicInfo->setItemWidget(item, listItem);
        // 为了更新每个 music 的 isLike 状态
        connect(listItem, &ListItem::musicLikeRefresh, this, [=](bool isLike){
             // 通知主界面：更新了每个 music 的状态，就要更新三个界面上的状态
             emit pageLikeRefresh(isLike, musicId);
        });
    }

    // 加载完音乐后立马显示 窗口重绘
    // update() 将重绘事件放入事件循环队列中，不是同步的，不会立马显示
    repaint();  // 立马显示，同步操作
}

void CommonForm::addMusicToPlaylist(MusicList &musicList, QMediaPlaylist *playlist)
{
    for(auto e : musicList)
    {
        switch(type)
        {
            case LIKE:
                if(e.getIsLike()) playlist->addMedia(e.getMusicUrl());
                break;
            case LOCAL:
                playlist->addMedia(e.getMusicUrl());
                break;
            case RECENT:
                if(e.getIsHistory()) playlist->addMedia(e.getMusicUrl());
                break;
            default:
                qDebug() << "未知的页面";
        }
    }
}

QString CommonForm::getMusicIdByIndex(int index)
{
    if(index >= musicOfPage.size())
    {
        qDebug() << "无效的歌曲";
        return "";
    }
    return musicOfPage[index];
}

void CommonForm::on_playAllButton_clicked()
{
    emit playAll(type);
}
